package pe.gob.mininter.dirandro.vaadin.panel.util;


import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.transaction.annotation.Transactional;

import pe.gob.mininter.dirandro.model.Distrito;
import pe.gob.mininter.dirandro.model.Pais;
import pe.gob.mininter.dirandro.model.Persona;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.PersonaService;
import pe.gob.mininter.dirandro.service.UbigeoService;
import pe.gob.mininter.dirandro.service.ValorService;
import pe.gob.mininter.dirandro.util.BeanValidar;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.panel.mantenimiento.PanelMantenEmpresa;
import pe.gob.mininter.dirandro.vaadin.panel.mantenimiento.PanelMantenLetrado;
import pe.gob.mininter.dirandro.vaadin.panel.mantenimiento.PanelMantenPolicia;
import pe.gob.mininter.dirandro.vaadin.util.Injector;
import pe.gob.mininter.dirandro.vaadin.util.listener.PanelAgregarPersonaListener;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;


public class PanelAgregarPersona extends CustomComponent implements ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private HorizontalLayout pnl5;
	@AutoGenerated
	private Button btnCancelar;
	@AutoGenerated
	private Button btnGrabar;
	@AutoGenerated
	private HorizontalLayout pnl4;
	@AutoGenerated
	private PopupDateField dfFechaNacimiento;
	@AutoGenerated
	private ComboBox cmbLugarNacimiento;
	@AutoGenerated
	private HorizontalLayout pnl3;
	@AutoGenerated
	private ComboBox cmbNacionalidad;
	@AutoGenerated
	private OptionGroup rbSexo;
	@AutoGenerated
	private HorizontalLayout pnl2;
	@AutoGenerated
	private TextField txtMaterno;
	@AutoGenerated
	private TextField txtPaterno;
	@AutoGenerated
	private TextField txtNombre;
	@AutoGenerated
	private HorizontalLayout pnl1;
	@AutoGenerated
	private ComboBox cmbEstadoCivil;
	@AutoGenerated
	private TextField txtNumero;
	@AutoGenerated
	private ComboBox cmbTipoDocumento;
	
	private static final long serialVersionUID = 4354750785128082366L;
	
	private Persona persona;
		
	private ValorService valorService;
	private UbigeoService ubigeoService;
	private PersonaService personaService;
	
	private PanelMantenPolicia pnlMantenPolicia= null;
	private PanelMantenLetrado pnlMantenLetrado = null;
	private PanelMantenEmpresa pnlMantenEmpresa = null;
	
	private PanelAgregarPersonaListener panelAgregarPersonaReponder;
	
	public PanelAgregarPersona() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		
		valorService = Injector.obtenerServicio(ValorService.class);
		ubigeoService = Injector.obtenerServicio(UbigeoService.class );
		personaService = Injector.obtenerServicio(PersonaService.class);
		
		
		postConstruct();
	}
	
	public PanelAgregarPersona(PanelMantenPolicia panelMantenPolicia, Persona persona) {
		this();
		this.pnlMantenPolicia = panelMantenPolicia;
	}
	
	public PanelAgregarPersona(PanelMantenLetrado pnlMantenLetrado, Persona persona) {
		this();
		this.pnlMantenLetrado = pnlMantenLetrado;
	}
	
	public PanelAgregarPersona(PanelMantenEmpresa pnlMantenEmpresa, Persona persona) {
		this();
		this.pnlMantenEmpresa = pnlMantenEmpresa;
		
	}
	
	public void postConstruct() {
		cargarDatos();
		btnGrabar.addListener((ClickListener)this);
		btnCancelar.addListener((ClickListener)this);
	}
	
	public void cargarDatos(){
		rbSexo.addItem("M");
		rbSexo.addItem("F");
		
		cmbTipoDocumento.setInputPrompt("tipoDocumento");				
		List<Valor> lstTipoDocumento = valorService.obtenerLista(Constante.LISTA.CODIGO.DOCUMENTO_TIPO);		
		BeanItemContainer<Valor> bicTipoDocumentos = new BeanItemContainer<Valor>(Valor.class,  lstTipoDocumento);		
		cmbTipoDocumento.setContainerDataSource(bicTipoDocumentos);		
		cmbTipoDocumento.setItemCaptionPropertyId("nombre");
		
		cmbEstadoCivil.setInputPrompt("estadoCivil");				
		List<Valor> lstEstadoCivil = valorService.obtenerLista(Constante.LISTA.CODIGO.ESTADO_CIVIL);		
		BeanItemContainer<Valor> bicEstadoCiviles = new BeanItemContainer<Valor>(Valor.class,  lstEstadoCivil);		
		cmbEstadoCivil.setContainerDataSource(bicEstadoCiviles);		
		cmbEstadoCivil.setItemCaptionPropertyId("nombre");
		
		List<Pais> lstNacionalidad = ubigeoService.obtenerPaises();
		cmbNacionalidad.setInputPrompt("Nacionalidad");
		cmbNacionalidad.setItemCaptionPropertyId("nombre");
		cmbNacionalidad.setContainerDataSource(new BeanItemContainer<Pais>(Pais.class, lstNacionalidad));
		
		List<Distrito> lstLugarNacimiento = ubigeoService.obtenerTodos();	
		cmbLugarNacimiento.setInputPrompt("Distrito - Provincia - Departamento");
		cmbLugarNacimiento.setItemCaptionPropertyId("nombreCompleto");
		cmbLugarNacimiento.setContainerDataSource(new BeanItemContainer<Distrito>(Distrito.class,  lstLugarNacimiento));
	} 

	public void setPanelAgregarPersonaReponder(
			PanelAgregarPersonaListener panelAgregarPersonaReponder) {
		this.panelAgregarPersonaReponder = panelAgregarPersonaReponder;
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if (event.getButton().equals(btnGrabar)) {
			 registrarPersona();
			 
			 if(pnlMantenPolicia != null)
			 {
				 pnlMantenPolicia.setPersonaPopUp(persona);
				 pnlMantenPolicia.obtenerDatosPersona();
			 }
			 else if(pnlMantenLetrado != null)
			 {
				 pnlMantenLetrado.setPersonaPopUp(persona);
				 pnlMantenLetrado.obtenerDatosPersona();
			 }
			 else if(this.pnlMantenEmpresa != null)
			 {
				 pnlMantenEmpresa.setPersonaPopUp(persona);
				 pnlMantenEmpresa.obtenerDatosPersona();
			 }
			 else if(this.panelAgregarPersonaReponder != null) {
				 this.panelAgregarPersonaReponder.setPersonaPopUp(persona);
			 }
			 
			 getApplication().getMainWindow().removeWindow(getWindow());
		}
		else if (event.getButton().equals(btnCancelar)) {
			 getApplication().getMainWindow().removeWindow(getWindow());
		}
	}	
	
	@Transactional
	private void registrarPersona(){
		
		persona = new Persona();
		persona.setNombres(txtNombre.getValue() != null ? txtNombre.getValue().toString() : StringUtils.EMPTY);
		persona.setApeMaterno(txtMaterno.getValue() != null ? txtMaterno.getValue().toString() : StringUtils.EMPTY);
		persona.setApePaterno(txtPaterno.getValue() != null ? txtPaterno.getValue().toString() : StringUtils.EMPTY);
		persona.setNroDocumento(txtNumero.getValue() != null ? txtNumero.getValue().toString() : StringUtils.EMPTY);		
		persona.setTipoDocumento((Valor) cmbTipoDocumento.getValue());
		persona.setEstadoCivil((Valor) cmbEstadoCivil.getValue());
		persona.setFecNacimiento((Date) dfFechaNacimiento.getValue());
		persona.setNacionalidad((Pais) cmbNacionalidad.getValue());
		persona.setSexo(rbSexo.getValue() != null ? rbSexo.getValue().toString() : StringUtils.EMPTY);
		
		HarecUtil.validar(getWindow(), persona, new BeanValidar[]{
				new BeanValidar("tipoDocumento", new Object[]{"Tipo de Documento"}, cmbTipoDocumento),
				new BeanValidar("nroDocumento", new Object[]{"Nro de Documento"}, txtNumero),
				new BeanValidar("nombres", new Object[]{"Nombres"}, txtNombre),
				new BeanValidar("apePaterno", new Object[]{"Apellido Paterno"}, txtPaterno),
				new BeanValidar("apeMaterno", new Object[]{"Apellido Materno"}, txtMaterno),
				new BeanValidar("sexo", new Object[]{"Sexo"}, rbSexo),
				new BeanValidar("nacionalidad", new Object[]{"Nacionalidad"}, cmbNacionalidad)});
		
		personaService.crear(persona);
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("600px");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("600px");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}
	
	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setCaption("Nueva Persona");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		pnlPrincipal.setSpacing(true);
		
		// pnl1
		pnl1 = buildPnl1();
		pnlPrincipal.addComponent(pnl1);
		
		// pnl2
		pnl2 = buildPnl2();
		pnlPrincipal.addComponent(pnl2);
		
		// pnl3
		pnl3 = buildPnl3();
		pnlPrincipal.addComponent(pnl3);
		
		// pnl4
		pnl4 = buildPnl4();
		pnlPrincipal.addComponent(pnl4);
		
		// pnl5
		pnl5 = buildPnl5();
		pnlPrincipal.addComponent(pnl5);
		pnlPrincipal.setComponentAlignment(pnl5, new Alignment(20));
		
		return pnlPrincipal;
	}
	
	@AutoGenerated
	private HorizontalLayout buildPnl1() {
		// common part: create layout
		pnl1 = new HorizontalLayout();
		pnl1.setImmediate(false);
		pnl1.setWidth("-1px");
		pnl1.setHeight("-1px");
		pnl1.setMargin(false);
		pnl1.setSpacing(true);
		
		// cmbTipoDocumento
		cmbTipoDocumento = new ComboBox();
		cmbTipoDocumento.setCaption("Tipo Documento");
		cmbTipoDocumento.setImmediate(false);
		cmbTipoDocumento.setWidth("100px");
		cmbTipoDocumento.setHeight("-1px");
		cmbTipoDocumento.setRequired(true);
		pnl1.addComponent(cmbTipoDocumento);
		
		// txtNumero
		txtNumero = new TextField();
		txtNumero.setCaption("Numero");
		txtNumero.setImmediate(false);
		txtNumero.setWidth("90px");
		txtNumero.setHeight("-1px");
		txtNumero.setRequired(true);
		pnl1.addComponent(txtNumero);
		
		// cmbEstadoCivil
		cmbEstadoCivil = new ComboBox();
		cmbEstadoCivil.setCaption("Estado Civil");
		cmbEstadoCivil.setImmediate(false);
		cmbEstadoCivil.setWidth("-1px");
		cmbEstadoCivil.setHeight("-1px");
		pnl1.addComponent(cmbEstadoCivil);
		
		return pnl1;
	}
	
	@AutoGenerated
	private HorizontalLayout buildPnl2() {
		// common part: create layout
		pnl2 = new HorizontalLayout();
		pnl2.setImmediate(false);
		pnl2.setWidth("-1px");
		pnl2.setHeight("-1px");
		pnl2.setMargin(false);
		pnl2.setSpacing(true);
		
		// txtNombre
		txtNombre = new TextField();
		txtNombre.setCaption("Nombres");
		txtNombre.setImmediate(false);
		txtNombre.setWidth("-1px");
		txtNombre.setHeight("-1px");
		txtNombre.setRequired(true);
		pnl2.addComponent(txtNombre);
		
		// txtPaterno
		txtPaterno = new TextField();
		txtPaterno.setCaption("Apellido Paterno");
		txtPaterno.setImmediate(false);
		txtPaterno.setWidth("-1px");
		txtPaterno.setHeight("-1px");
		txtPaterno.setRequired(true);
		pnl2.addComponent(txtPaterno);
		
		// txtMaterno
		txtMaterno = new TextField();
		txtMaterno.setCaption("Apellido Materno");
		txtMaterno.setImmediate(false);
		txtMaterno.setWidth("-1px");
		txtMaterno.setHeight("-1px");
		txtMaterno.setRequired(true);
		pnl2.addComponent(txtMaterno);
		
		return pnl2;
	}
	
	@AutoGenerated
	private HorizontalLayout buildPnl3() {
		// common part: create layout
		pnl3 = new HorizontalLayout();
		pnl3.setImmediate(false);
		pnl3.setWidth("-1px");
		pnl3.setHeight("-1px");
		pnl3.setMargin(false);
		pnl3.setSpacing(true);
		
		// rbSexo
		rbSexo = new OptionGroup();
		rbSexo.setStyleName("horizontal");
		rbSexo.setCaption("Sexo");
		rbSexo.setImmediate(false);
		rbSexo.setWidth("-1px");
		rbSexo.setHeight("20px");
		rbSexo.setRequired(true);
		pnl3.addComponent(rbSexo);
		
		// cmbNacionalidad
		cmbNacionalidad = new ComboBox();
		cmbNacionalidad.setCaption("Nacionalidad");
		cmbNacionalidad.setImmediate(false);
		cmbNacionalidad.setWidth("-1px");
		cmbNacionalidad.setHeight("-1px");
		pnl3.addComponent(cmbNacionalidad);
		
		return pnl3;
	}
	
	@AutoGenerated
	private HorizontalLayout buildPnl4() {
		// common part: create layout
		pnl4 = new HorizontalLayout();
		pnl4.setImmediate(false);
		pnl4.setWidth("-1px");
		pnl4.setHeight("-1px");
		pnl4.setMargin(false);
		pnl4.setSpacing(true);
		
		// cmbLugarNacimiento
		cmbLugarNacimiento = new ComboBox();
		cmbLugarNacimiento.setCaption("Lugar Nacimiento:");
		cmbLugarNacimiento.setImmediate(false);
		cmbLugarNacimiento.setWidth("-1px");
		cmbLugarNacimiento.setHeight("-1px");
		pnl4.addComponent(cmbLugarNacimiento);
		
		// dfFechaNacimiento
		dfFechaNacimiento = new PopupDateField();
		dfFechaNacimiento.setCaption("Fecha de Nacimiento:");
		dfFechaNacimiento.setImmediate(false);
		dfFechaNacimiento.setWidth("-1px");
		dfFechaNacimiento.setHeight("-1px");
		pnl4.addComponent(dfFechaNacimiento);
		
		return pnl4;
	}
	
	@AutoGenerated
	private HorizontalLayout buildPnl5() {
		// common part: create layout
		pnl5 = new HorizontalLayout();
		pnl5.setImmediate(false);
		pnl5.setWidth("-1px");
		pnl5.setHeight("-1px");
		pnl5.setMargin(false);
		pnl5.setSpacing(true);
		
		// btnGrabar
		btnGrabar = new Button();
		btnGrabar.setCaption("Grabar");
		btnGrabar.setImmediate(true);
		btnGrabar.setWidth("80px");
		btnGrabar.setHeight("-1px");
		pnl5.addComponent(btnGrabar);
		
		// btnCancelar
		btnCancelar = new Button();
		btnCancelar.setCaption("Cancelar");
		btnCancelar.setImmediate(true);
		btnCancelar.setWidth("80px");
		btnCancelar.setHeight("-1px");
		pnl5.addComponent(btnCancelar);
		
		return pnl5;
	}
}
